﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DAL
{
    public partial class Presupuesto
    {
        public string getCorrelativo(dbGestionDataContext _db, int idObra,int tipoObra)
        {
            string numDocumento = "";

            var q= from a in _db.Presupuesto
                   where a.idObra == idObra & a.tipoOrigen == tipoObra
                    group a by a.idObra into g
                   select  new
                   {
                       idObra=g.Key,
                       codigo=g.Max(p=>p.codigo)
                   };


            
            if (q.Count() == 0)
            {
                numDocumento = "0000001";
            }
            else
            {
                int numActual = int.Parse(q.First().codigo);
                numActual++;
                if (numActual < 10)
                    numDocumento = "000000" + numActual.ToString();
                else if (numActual < 100)
                    numDocumento = "00000" + numActual.ToString();
                else if (numActual < 1000)
                    numDocumento = "0000" + numActual.ToString();
                else if (numActual < 10000)
                    numDocumento = "000" + numActual.ToString();
                else if (numActual < 100000)
                    numDocumento = "00" + numActual.ToString();
                else if (numActual < 1000000)
                    numDocumento = "0" + numActual.ToString();
                
                else if (numActual < 10000000)
                    numDocumento = numActual.ToString();
                else if (numActual > 9999999)
                {
                    throw new Exception("Limite  de Correlativo Comparativo");
                }


            }
            return numDocumento;

        }

        public int getidAnterior(dbGestionDataContext _db, int idinternal, int idObra)
        {
            int intAnterior = 0;

            
            var id = from i in _db.Presupuesto
                     where i.idInternal < idinternal && i.idObra== idObra
                     group i by i.idObra into g
                     select new
                     {
                         idAnterior = g.Max(p => p.idInternal)
                     };

            if (id.Count() > 0)
            {
                intAnterior = id.First().idAnterior;

            }
            else
            {
                throw new Exception("No existe Registros");
            }


            return intAnterior;

        }

        public int getidSiguiente(dbGestionDataContext _db, int idinternal, int idObra)
        {
            int intSiguiente = 0;

            //revisar la sentencia generada
            var id = from i in _db.Presupuesto
                     where i.idInternal > idinternal && i.idObra == idObra
                     group i by i.idObra into g
                     select new
                     {
                         idSiguiente = g.Min(p => p.idInternal)
                     };


            if (id.Count() > 0)
            {
                intSiguiente = id.First().idSiguiente;

            }
            else
            {
                throw new Exception("No existe Registros");
            }

            return intSiguiente;
        }


        public void update(dbGestionDataContext _db, 
            string  nombre, 
            string abreviacion,
            int idEmpleado)
        {
            
            this.nombre = nombre;
            this.descripcion = nombre;
            this.abreviacion = abreviacion;
            this.idMoneda = idMoneda;
            this.fechaMod = DateTime.Now;
            this.usuarioMod = idEmpleado;
            
            // relacion 1 a 1

            SubPresupuesto dbSubPresupuesto = _db.SubPresupuesto.Single(p =>p.idPresupuesto == this.idInternal);
            dbSubPresupuesto.Descripcion = nombre;

            _db.SubmitChanges();


        }

        public void updateRevisor(dbGestionDataContext _db, int idEmpleadoRevisor)
        {
            this.fechaRevisor = DateTime.Now;
            this.idEmpleadoRevisor = idEmpleadoRevisor;
            this.idEstado = 25;  //Revisado 1
            _db.SubmitChanges();
        }
        public void updateDesaprobarRevisor(dbGestionDataContext _db)
        {
            this.fechaRevisor = null;
            this.idEmpleadoRevisor = null;
            this.idEstado = 23;  //Generado
            _db.SubmitChanges();
        }


        public void updateAutorizado(dbGestionDataContext _db ,int  idAprobador)
        {
            this.fechaAprob = DateTime.Now;
            this.idEmpleadoAprob = idAprobador;
            this.idEstado = 26;  //Autorizado 2
            _db.SubmitChanges();
        }

        public void updateDesaprobarAutorizado(dbGestionDataContext _db)
        {
            this.fechaAprob = null;
            this.idEmpleadoAprob = null;
            this.idEstado = 23;  //Generado
            _db.SubmitChanges();
        }


        public decimal GetMontoTotal(dbGestionDataContext _db)
        {
            decimal total=0;

            var q = from a in _db.Recursos
                    where a.Partida.SubPresupuesto.idPresupuesto == this.idInternal
                    & a.nivel==0
                    select a;
            
            if (q.Count()>0)
            {
               total= q.Sum(p => p.parcial).Value;
            }
            return total;
        }


        public void updateTotal(dbGestionDataContext _db)
        {
            
                this.monto = GetMontoTotal(_db);
                _db.SubmitChanges();
        }



        public  int Add(dbGestionDataContext _db,
            string codigo,
            string descripcion,
            string nombre,
            string abreviacion,
            DateTime fecha,
            int usuarioCre,
            int idObra,
            int idMoneda,
            decimal tipoCambio,
            int tipoOrigen,
            int idEstado,
            string archivo)

        {


          this.codigo=codigo;
          this.descripcion = descripcion;
          this.fecha=fecha;
          this.fechaCre = DateTime.Now;
          this.fechaMod = DateTime.Now;
          this.usuarioCre = usuarioCre;
          this.usuarioMod = usuarioCre;
          this.idObra=idObra;
          this.idMoneda=idMoneda;
          this.monto =0;
          this.archivo = archivo;
         // this.tipoCambio = tipoCambio;
          this.tipoOrigen = tipoOrigen; // adicion en el sistema
          this.abreviacion = abreviacion;
          this.nombre = nombre;
          this.idEstado = idEstado;//ingresado por sistema;
            this.nivel=0;
          _db.Presupuesto.InsertOnSubmit(this);
          _db.SubmitChanges();
          return this.idInternal; 
        }


        public int AddAdicional(dbGestionDataContext _db,
           string codigo,
           string descripcion,
           string nombre,
           string abreviacion,
           DateTime fecha,
           int usuarioCre,
           int idObra,
           int idMoneda,          
            int idPresupuestoPadre)
                {
                        this.codigo = codigo;
                        this.descripcion = descripcion;
                        this.fecha = fecha;
                        this.fechaCre = DateTime.Now;
                        this.fechaMod = DateTime.Now;
                        this.usuarioCre = usuarioCre;
                        this.usuarioMod = usuarioCre;
                        this.monto = 0;
                        this.idObra = idObra;
                        this.idMoneda = idMoneda;
                        //this.tipoCambio = tipoCambio;
                        this.tipoOrigen = 2; 
                        this.abreviacion = abreviacion;
                        this.nombre = nombre;
                        this.idEstado = 23;
                        this.nivel=1;
                        this.idPadre=idPresupuestoPadre;
                        _db.Presupuesto.InsertOnSubmit(this);
                        _db.SubmitChanges();
                        return this.idInternal;




        }

    }
}